fn main() {
    let res = None;
    match res {
        Some(1) => println!("the value is 1"),
        // 变量匹配所有情况
        x => println!("default value: {res:?}"),
    }

    let is_match = false;
    // if let -> else if -> else if let
    if let Some(1) = res {

    } else if is_match {

    } else if let Some(2) = res {

    } else {
        println!("..")
    }

    let mut stack = vec![1, 2, 3];
    // while let 条件循环, 遇到None停止
    while let Some(top) = stack.pop() {
        println!("{}", top)
    }

    let v = ['a', 'b', 'c'];
    // for循环
    for (idx, val) in v.iter().enumerate() {
        println!("index:{idx}, value:{val}");
    }

    print_tuple(&(1, 2));

    let s = Some(String::from("hello"));
    // 使用_匹配，则不会转移所有权
    if let Some(_) = s {
        println!("found string");
    }
    // 用_s匹配，会绑定到_s变量上，所有权会转移
    if let Some(_s) = s {
        println!("found string:{_s}");
    }
    // println!("{:?}", s) // panic

    test_match();
}

// 在参数中进行模板匹配
fn print_tuple(&(x, y): &(i32, i32)) {
    println!("x:{x}, y:{y}")
}

fn test_match() {
    let num = Some(4);
    match num {
        Some(1) | Some(2) => todo!(),      // 多重匹配
        Some(x) if x > 2 => todo!(),  // 匹配守卫, 在match分支有加if判断
        Some(_x) => todo!(),
        None => todo!(),
    }

    // 只有数值和char值, 可以进行范围匹配
    let c = 'a';
    match c {
        'a' ..= 'j' => todo!(),
        _ => todo!(),
    }

}

struct Point {
    x: i32,
    y: i32,
}

fn test_match2() {
    let p = Point{ x: 1, y: 2 };
    match p {
        Point {x, y: 0} => todo!(), // 匹配y=0的情况
        Point {x, y: 2..=5 } => {
            // 范围匹配y
            println!("y is 2 to 5");
        }, 
        Point {x, y: y @ 6..=7 } => {  
            // 保存变量, 可与字段名同名
            println!("{y}")
        },
        Point {x: _, y: _} => todo!(),
    }
}